package envio;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

import java.util.HashMap;
import java.util.Map;

import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.Test;

import clientes.Cliente;
import productos.Presentacion;

public class TestEnvio {

	Map<Presentacion, Integer> productos;
	DateTime fechaEnvio;
	Cliente clienteQueRecibe;
	Envio envio;
	EstadoEnvio estadoEnvio;
	Presentacion presentacionEnvio;

	@Before
	public void setUp() throws Exception {
		productos = new HashMap<Presentacion, Integer>();
		envio = new Envio(productos, fechaEnvio);
	}

	@Test
	public void testCreoUnEnvioConYLoVerifico() {
		assertEquals(productos, envio.productos());
	}

	@Test
	public void testAsignacionDeFechaDeEnvioAUnEnvio() {
		envio.setFecha(DateTime.now());
		assertNotNull(envio.getFechaEnvio());
	}

	@Test
	public void testLeAgregoUnClienteAUnEnvio() {
		clienteQueRecibe = mock(Cliente.class);
		envio.setCliente(clienteQueRecibe);
		assertNotNull(envio.getCliente());
	}

	@Test
	public void testObtengoElListadoDeProductosQueTieneUnEnvio() {
		assertNotNull(envio.getProductos());
	}

	@Test
	public void testVerificoQueElEstadoDelEnvioSeaPendiente() {
		assertTrue(envio.pendiente());
	}

	@Test
	public void testVerificoQueElEstadoDelEnvioNoSeaCancelado() {
		assertFalse(envio.cancelado());
	}

	@Test
	public void testVerificoQueElEstadoDelEnvioNoSeaEnProceso() {
		assertFalse(envio.enProceso());
	}

	@Test
	public void testVerificoQueElEstadoDelEnvioNoSeaEntregado() {
		assertFalse(envio.entregado());
	}

	@Test
	public void testVerificoQueElEstadoDelEnvioNoSeaReprogramado() {
		assertFalse(envio.reprogramado());
	}

	@Test
	public void testVerificoQueElEstadoDelEnvioNoSeaSinStock() {
		assertFalse(envio.sinStock());
	}

	@Test
	public void testVerificoQueElEnvioSeaPosible() {
		presentacionEnvio = mock(Presentacion.class);
		productos.put(presentacionEnvio, 1);
		when(presentacionEnvio.stockDisponible(1)).thenReturn(true);
		assertTrue(envio.checkEnvioPosible());
	}

	@Test
	public void testUnEnvioNuevoNoCanceladoLoPasoACancelado() {
		assertFalse(envio.abonado());
		envio.setAbonado();
		assertTrue(envio.abonado());
	}

}
